#ifndef UNIT_H
#define UNIT_H

#include "resource.h"
#include "Tag.h"
#include <string>
#include <cstdint>
#include <ctime>

using string = std::string;

class BaseUnit{
    private:
    uint32_t index;

    protected:
    //单位的生命
    double life;
    //单位的建造时间
    GameTimeType buildTime;
    //单位唯一编号
    uint64_t id;
    //单位阵营
    uint32_t team;
    //坐标
    Location loc;

    public:
    //用于自增编号
    static uint64_t idCounter;

    BaseUnit(uint32_t index, uint32_t team);

    /********************************************************************************/
    /*                                获取当前生命值                                */
    /********************************************************************************/
    [[nodiscard]] inline double getLife()const;

    /********************************************************************************/
    /*                                获取生命值上限                                */
    /********************************************************************************/
    [[nodiscard]] double getLifeLimit()const;

    /********************************************************************************/
    /*                                   获取防御                                   */
    /********************************************************************************/
    [[nodiscard]] double getDefend()const;

    /********************************************************************************/
    /*                               获取建造所需时间                               */
    /********************************************************************************/
    [[nodiscard]] double getConsumeTime()const;

    /********************************************************************************/
    /*                               获取建造所需金钱                               */
    /********************************************************************************/
    [[nodiscard]] double getConsumeMoney()const;

    /********************************************************************************/
    /*                               获取建造所需能量                               */
    /********************************************************************************/
    [[nodiscard]] double getConsumeEnergy()const;

    /********************************************************************************/
    /*                          判断是否死亡,死亡返回true                           */
    /********************************************************************************/
    [[nodiscard]] bool isDie()const;

    /********************************************************************************/
    /*                                 获取单位名称                                 */
    /********************************************************************************/
    [[nodiscard]] const string &getName()const;

    /********************************************************************************/
    /*                                  获取单位id                                  */
    /********************************************************************************/
    [[nodiscard]] inline uint64_t getId()const;

    /********************************************************************************/
    /*                                 获取单位阵营                                 */
    /********************************************************************************/
    [[nodiscard]] inline uint32_t getTeam()const;

    /********************************************************************************/
    /*                                 获取单位坐标                                 */
    /********************************************************************************/
    [[nodiscard]] inline const Location &getLocation()const;

    /********************************************************************************/
    /*                              获取当前建造百分比                              */
    /********************************************************************************/
    virtual double getFinishPercent()const;

    /********************************************************************************/
    /*                                   减少生命                                   */
    /********************************************************************************/
    virtual bool consumeLife(double consume);

    /********************************************************************************/
    /*                                   增加生命                                   */
    /********************************************************************************/
    virtual bool addLife(double consume);

    /********************************************************************************/
    /*                                   开始建造                                   */
    /********************************************************************************/
    virtual void build();

    /********************************************************************************/
    /*                        用于在单位血量为0时做一些操作                         */
    /********************************************************************************/
    virtual void destroy() = 0;

    /********************************************************************************/
    /*                        用于在单位建造完成时做一些操作                        */
    /********************************************************************************/
    virtual void finish() = 0;

    virtual ~BaseUnit() = 0;
};

#endif

